//
//  OSSpinLockDemo.m
//  JKThreadTest
//
//  Created by 王冲 on 2018/10/24.
//  Copyright © 2018年 JK科技有限公司. All rights reserved.
//

#import "OSSpinLockDemo.h"

/**
 OSSpinLock 不再安全是因为会出现优先级反转问题，当有多条线程的时候，优先级比较高的线程会优先占用lock(锁)，优先级相对较低的线程就无法加锁，只有等优先级高的线程先执行完才可以进行加锁和解锁。
 */
#import <libkern/OSAtomic.h>

@interface OSSpinLockDemo ()

@property(nonatomic,assign) OSSpinLock ticketLock;
@property(nonatomic,assign) OSSpinLock moneyLock;

@end

@implementation OSSpinLockDemo

-(instancetype)init{
    
    if (self = [super init]) {
        
        // 初始化锁
        // 买票的锁
        self.ticketLock = OS_SPINLOCK_INIT;
        // 存钱取钱的锁（虽然存钱和取钱是调用不同的方法，但是两个方法不是很可能同时进行的，所以我们要加锁，在两个方法里面都加同一把锁，这样能够存取不在同一个时间段）
        self.moneyLock = OS_SPINLOCK_INIT;
    }
    
    return self;
}

-(void)__buyTicket{
    
    OSSpinLockLock(&_ticketLock);
    
    [super __buyTicket];
    
    OSSpinLockUnlock(&_ticketLock);
    
}

-(void)__drawMoney{
    
    OSSpinLockLock(&_moneyLock);
    
    [super __drawMoney];
    
    OSSpinLockUnlock(&_moneyLock);
}

-(void)__saveMoney{
    
    OSSpinLockLock(&_moneyLock);
    
    [super __saveMoney];
    
    OSSpinLockUnlock(&_moneyLock);
}

@end
